package com.yzh.design.demo.factory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class JDKProxy {
    public static <T> T getProxy(Class<T> interfaceClass, ICacheAdapter cacheAdapter){
        InvocationHandler handler = new JDKInvocationHandler(cacheAdapter);
        //得到interfaceClass实现的接口，也就是CacheService
        Class<?>[] classes = interfaceClass.getInterfaces();
        /**
         * Proxy.newProxyInstance()的参数
         * 1.ClassLoader：指定生成的代理对象的ClassLoader，用来加载生成的代理类。
         * 2.Class[] interfaces：指定生成的代理对象实现的接口数组。表示需要代理的接口。
         * 3.InvocationHandler：是一个实现了InvocationHandler接口的实例对象，用来处理代理对象方法的调用。
             在代理对象的方法被调用时，会被转发到InvocationHandler的invoke方法，从而执行具体的逻辑。
         */
        /**
         * 解释代码流程
         * 首先入参参数是(CacheServiceImpl.class, new EGMCacheAdapter())，通过Proxy的newProxyInstance方法，将CacheServiceImpl
         * 的代理对象创建，实现的接口是CacheServiceImpl的实现接口(CacheService)。handler处理代理对象的方法调用。但是我们的Handler实现中
         * 是使用的ICacheAdapter，所以CacheService接口的方法必须和ICacheAdapter的方法名称、参数相同，否则使用会失败。我们通过CacheService
         * 的实现类成功调用ICacheAdapter的实现类。
         */
        return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[]{classes[0]}, handler);
    }
}
